/**
 * PagFormAtividade.java
 * 
 * Projeto: SGA-LEDS
 * 
 * Rodrigo Soares Maia
 * IFES - Instituto Federal do Espírito Santo - Campus Serra
 */

package controleAtividades.cih;

import controleAtividades.cci.CtrlAtividades;
import controleInterno.cci.CtrlInterno;
import controleAtividades.cdp.Atividade;
import controleAtividades.cdp.NivelAtividade;
import controleInterno.cdp.Colaborador;
import controleInterno.cdp.Prioridade;
import controleInterno.cdp.Projeto;
import controleInterno.cdp.TipoAtividade;
import controleInterno.cdp.TipoProjeto;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Separator;
import org.zkoss.zul.Slider;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

public class PagFormAtividade extends GenericForwardComposer
{
    private Window winFormAtividade;
    private Textbox descricao;
    private Datebox dataInicio;
    private Datebox dataFim;
    private Slider progresso;
    private Label labelProgresso;
    private Spinner duracao;
    private Combobox tipoAtividade;
    private Combobox responsavel;
    private Button alocarColaboradores;
    private Image verColaboradores;
    private Popup popupAlocados;
    private Button confirmar;
    
    private int MODO;
    private Colaborador c;
    private Projeto p;
    private NivelAtividade n;
    private Atividade obj;
    private Atividade atividadePai;
    List<Colaborador> colaboradoresAlocados = null;

    CtrlAtividades ctrlA = CtrlAtividades.getInstance();
    CtrlInterno ctrlI = CtrlInterno.getInstance();

    @Override
    public void doAfterCompose(Component comp) throws Exception
    {
        super.doAfterCompose(comp);
        
        ctrlA.setPagFormAtividade(this);
        
        p = (Projeto) Executions.getCurrent().getSession().getAttribute("projeto");
        
        //TODO soh tem o usuario na session, e nao da pra pegar o colaborador direto
        c = (Colaborador) Executions.getCurrent().getSession().getAttribute("colaborador");
        
        n = (NivelAtividade) Executions.getCurrent().getArg().get("nivel");
        
        //TODO restringir fim do projeto somente para depois do inicio do mesmo
        
        //TODO deixar padrão o usuário atual como responsável
        
        //TODO setar o tipoAtividade do pai (se houver) como padrao??
        
        //preenchendo a lista de tipos
        List<TipoAtividade> tipos;
        tipos = ctrlI.obterTipos();
        
        if (tipos != null)
        {
            ListModelList<TipoAtividade> listTipo = new ListModelList<>(tipos, true);
            tipoAtividade.setModel(listTipo);
        }

        tipoAtividade.setReadonly(true);
        
        //preenchendo a lista de colaboradores (responsavel)
        List<Colaborador> colaboradores;
        colaboradores = ctrlI.obterColaboradores();
        
        if (colaboradores != null)
        {
            ListModelList<Colaborador> listCol = new ListModelList<>(colaboradores, true);
            responsavel.setModel(listCol); 
        }

        responsavel.setReadonly(true);
        
        //TODO se for cadastro de atividade filha, travar o tipoAtividade
        
        if (n == NivelAtividade.INDIVIDUAL)
        {
            alocarColaboradores.setDisabled(true);
        }
    }

    public void onCreate$winFormAtividade()
    {
        //verificando se existe algum usuario logado, se nao existir eh redirecionado para o login
        if (Executions.getCurrent().getSession().getAttribute("usuario") == null)
        {
            Executions.sendRedirect("/");
            winFormAtividade.detach();
        }
        else
        {
            MODO = (Integer) arg.get("tipo");

            if (MODO != CtrlInterno.SALVAR)
            {
                obj = (Atividade) arg.get("obj");
                this.preencherTela();
                
                if (obj.getNivel() == NivelAtividade.INDIVIDUAL)
                {
                    alocarColaboradores.setDisabled(true);
                }
                
                //se a atividade for pai, ela eh formada por suas filhas, portanto nao eh possivel alterar as datas nem a duracao!
                if (ctrlA.obterFilhasGeral(obj) != null)
                {
                    if (!ctrlA.obterFilhasGeral(obj).isEmpty())
                    {
                        dataInicio.setDisabled(true);
                        dataFim.setDisabled(true);
                        duracao.setDisabled(true);
                    }
                }

                if (MODO == CtrlInterno.CONSULTAR)
                {
                    this.confirmar.setVisible(false);
                    this.bloquearTela();
                    
                    this.winFormAtividade.setTitle("Consultar Atividade");
                }
            }
            else if (MODO == CtrlInterno.SALVAR_FILHA)
            {
                this.atividadePai = (Atividade) arg.get("obj");
            }
        }
    }
    
    public void onClick$alocarColaboradores(Event event)
    {
        ctrlA.abrirAlocarColaboradores(obj);
    }
    
    public void onChanging$dataInicio(Event event)
    {
        Calendar inicio = Calendar.getInstance();
        inicio.setTime(dataInicio.getValue());
        
        Atividade paiGeral = ctrlA.obterPaiGeral(obj);
        
        //se a data de inicio for antes da data da atividade pai planejada, eh avisado!
        if (inicio.before(paiGeral.getDataInicio()))
        {
            System.out.println("passou do inicio");
            //TODO avisar...
        }
    }
    
    //TODO fazer o mesmo para com a pai GRUPO
    public void onChanging$dataFim(Event event)
    {
        Calendar fim = Calendar.getInstance();
        fim.setTime(dataFim.getValue());
        
        Atividade paiGeral = ctrlA.obterPaiGeral(obj);
        
        //se a data de inicio for antes da data da atividade pai planejada, eh avisado!
        if (fim.after(paiGeral.getDataFim()))
        {
            System.out.println("passou do fim");
            //TODO avisar...
        }
    }

    public void onClick$confirmar(Event event)
    {
        ArrayList<Object> listaA = new ArrayList<>();
        Map atributos = new HashMap();
        
        Calendar inicio = Calendar.getInstance();
        Calendar fim = Calendar.getInstance();
        
        inicio.setTime(dataInicio.getValue());
        fim.setTime(dataFim.getValue());

        if (MODO == CtrlInterno.EDITAR)
        {
            Double novaDuracao = Double.parseDouble((new Integer(duracao.getValue()).toString())); //convertendo o int para Double //TODO nao seria int??
            Double antigaDuracao = obj.getDuracao();
            obj.setDescricao(descricao.getText());
            obj.setDataInicio(inicio);
            obj.setDataFim(fim);
            obj.setProgresso(Double.parseDouble((new Integer(progresso.getCurpos()).toString()))); //convertendo o int para Double //TODO nao seria int??
            obj.setDuracao(novaDuracao);
            obj.setTipo((TipoAtividade) tipoAtividade.getSelectedItem().getValue()); //TODO sempre tem que ter? e se for null
            obj.setResponsavel((Colaborador) responsavel.getSelectedItem().getValue());
            
            
           //Atividade a = obj.getAtividadePai();
            
            
            //TODO passar pra apl
            //adaptando os pais do mesmo nivel as novas datas...
//            while (a != null)
//            {
//                if (a.getNivel() == obj.getNivel())
//                {
//                    if (a.getDataInicio().after(inicio))
//                    {
//                        a.setDataInicio(inicio);
//                    }
//                    
//                    if (a.getDataFim().before(fim))
//                    {
//                        a.setDataFim(fim);
//                    }
//                    
//                    a.setDuracao(a.getDuracao() + Double.parseDouble((new Integer(duracao.getValue()).toString())));
//                    
//                    ctrlA.alterarAtividade(a);
//                }
//                else
//                {
//                    break;
//                }
//                
//                a = a.getAtividadePai();
//            }
            
            if (ctrlA.alterarAtividade(obj, colaboradoresAlocados) != null)
            {
                winFormAtividade.onClose();
                //TODO mostrar mensagens de sucesso
            }
            
            ctrlA.alterarPais(obj, novaDuracao - antigaDuracao);
        }
        else
        {
            listaA.add(descricao.getValue());
            listaA.add(inicio);
            listaA.add(fim);
            listaA.add(Double.parseDouble((new Integer(progresso.getCurpos()).toString()))); //convertendo o int para Double //TODO nao seria int??
            listaA.add(Double.parseDouble((new Integer(duracao.getValue()).toString()))); //convertendo o int para Double //TODO nao seria int??
            listaA.add(tipoAtividade.getSelectedItem().getValue());
            listaA.add(responsavel.getSelectedItem().getValue());
            
            listaA.add(p);
            
            //se houver uma atividade pai ela eh setada, senao vai null mesmo
            listaA.add(atividadePai != null ? atividadePai : null);
            
            if (ctrlA.salvarAtividade(listaA, colaboradoresAlocados) != null)
            {
                winFormAtividade.onClose();
                //TODO mostrar mensagens de sucesso
            }
        }
    }
    
    public void preencherTela()
    {
        descricao.setText(obj.getDescricao());
        dataInicio.setValue(obj.getDataInicio().getTime());
        dataFim.setValue(obj.getDataFim().getTime());
        progresso.setCurpos(obj.getProgresso().intValue());
        labelProgresso.setValue(obj.getProgresso().intValue() + "%");
        duracao.setValue(obj.getDuracao().intValue());
        
        List<Comboitem> itens = tipoAtividade.getItems();
        for (int i = 0; i < itens.size(); i++) {
            //setando o tipoAtividade da atividade
            if (itens.get(i).getValue() == obj.getTipo()) {
                tipoAtividade.setSelectedItem(itens.get(i));
            }
        }
        
        itens = responsavel.getItems();
        for (int i = 0; i < itens.size(); i++) {
            //setando o responsavel
            if (itens.get(i).getValue() == obj.getResponsavel()) {
                responsavel.setSelectedItem(itens.get(i));
            }
        }
        
        //setando colaboradores alocados na popup
        List<Colaborador> alocados = ctrlA.obterColaboradoresAlocados(obj);
        this.preencherPopup(alocados);
        
        //se a atividade for pai (tiver filhas)...
        if (!ctrlA.obterFilhas(obj).isEmpty())
        {
            //dataInicio.setDisabled(true);
            //dataFim.setDisabled(true);
        }
    }
    
    public void preencherPopup(List<Colaborador> alocados)
    {
        this.colaboradoresAlocados = alocados;
        
        Image icone;
        Separator separador;
        Label nome;
        
        //limpando o que jah tinha na popup (se tinha algo)
        popupAlocados.getChildren().clear();
        
        if (alocados != null)
        {
            if (!alocados.isEmpty())
            {
                for (Colaborador colaborador : alocados)
                {
                    icone = new Image("/images/person-icon.png");
                    icone.setParent(popupAlocados);

                    separador = new Separator("vertical"); separador.setSpacing("3px");
                    separador.setParent(popupAlocados);

                    nome = new Label(colaborador.getNome());
                    nome.setParent(popupAlocados);

                    separador = new Separator("horizontal"); separador.setSpacing("3px");
                    separador.setParent(popupAlocados);
                }
            }
            else
            {
                nome = new Label("Não há ninguém alocado!");
                nome.setParent(popupAlocados);
            }
        }
        else
        {
            nome = new Label("Não há ninguém alocado!");
            nome.setParent(popupAlocados);
        }
    }
    
    private void bloquearTela()
    {
        descricao.setDisabled(true);
        dataInicio.setDisabled(true);
        dataFim.setDisabled(true);
        progresso.setVisible(false);
        duracao.setDisabled(true);
        tipoAtividade.setDisabled(true);
        responsavel.setDisabled(true);
        alocarColaboradores.setDisabled(true);
    }

    public void onClick$cancelar(Event event)
    {
        winFormAtividade.onClose();
    }
}
